'''
Created on 21 nov. 2014

@author: Damien Torond et Geoffrey Sentost
Module Voiture
'''

from modele import Client, Placement

'''
import des modules Client et Placement depuis modele.
'''

class Voiture:
    
    '''
    La classe Voiture modelise la voiture d'un client.
    '''
    
    def __init__(self, longueur, largeur, immatriculation, garee = None):
        '''
        Constructeur de la classe Voiture.
        Attributs:
            - largeur de type int, largeur de la voiture.
            - longueur de type int, longueur de la voiture.
            - immatriculation, de type string, immatriculation de la voiture.
            - proprietaire de type string, initialise a null et associe un client.
            - placement de type string, initialise a null.
            - placeAttribuee de type booleen, pour savoir si la place est attribue a un superAbonne.
            - estGaree de type booleen, pour savoir si une voiture est garee ou non.
            
        '''
        self.largeur = largeur # on préferera la largeur, à la hauteur
        self.longueur = longueur
        self.immatriculation = immatriculation
        self.proprietaire = "null"
        self.placement = "null"
        self.placeAttribuee = False
        if garee :
            self.estGaree = garee
        else :
            self.estGaree = False
    
            
    def getProprietaire(self):
        '''
        Methode : accesseur de l'attribut estLibre qui retourne celui-ci.
        '''
        return self.proprietaire
    
 
    def getEstGaree(self):
        '''
        Methode : accesseur de l'attribut estLibre qui retourne celui-ci.
        '''
        return self.estGaree

    
    def getImmatriculation(self):
        '''
        Methode : accesseur de l'attribut estLibre qui retourne celui-ci.
        '''
        return self.immatriculation
   
     
    def getLongueur(self):
        '''
        Methode : accesseur de l'attribut estLibre qui retourne celui-ci.
        '''
        return self.longueur

    
     
    def getLargeur(self):
        '''
        Methode : accesseur de l'attribut estLibre qui retourne celui-ci.
        '''
        return self.largeur
    
   
    
    def demanderPlacement(self, acces, bdd):
        '''
        Methode : demande une instance de Acces et de CtrlBdd en parametre.
        Permet de demander un placement pour la voiture et de lancer la procedure d'entree
        depuis Acces.
        
        '''
        acces.lancerProcedureEntree(self, bdd)
    
    
    def demanderSortie(self, acces, bdd):
        '''
        Methode : demande une instance de Acces et de CtrlBdd en parametre.
        Permet de demander la sortie d'une voiture, en lancant la procedure de sortie depuis
        Acces.
        '''
        acces.lancerProcedureSortie(self, bdd)
    
        
    def garer(self):
        '''
        Methode : Met l'attribut estGaree a True pour dire qu'une voiture est maintenant garee.
        '''
        self.estGaree = True
    
    
    def sortir(self):
        '''
        Methode : Met l'attribut estGaree a False pour dire qu'une voiture est maintenant partie.
        '''
        self.estGaree = False
    
    
    def setPlacement(self, bdd, placement = None):
        '''
        Methode : demande une instance de CtrlBdd et de Placement en parametre.
        permet de modifier et d'ajouter un placement pour une voiture.
        '''
        if placement :
            self.placement = placement
            bdd.ajouterPlacement(self, placement)
    
        
    def getPlacement(self):
        '''
        Methode : accesseur de l'attribut estLibre qui retourne celui-ci.
        '''
        return self.placement

    
    def setProprietaire(self, client):
        '''
        Methode : modificateur de l'attribut proprietaire qui modifie celui ci.
        '''
        self.proprietaire = client
        
    
    
    def definirClient(self, nom, prenom, adresse, mail, tel, id):
        '''
        Methode : attend un nom, prenom, adresse, mail, telephone et id en parametre.
        Permet de definir un client et de l'associer au proprietaire.
        '''
        self.proprietaire = Client.Client(self, nom, prenom, adresse, mail, tel, 0, id)

    
    def definirPlacement(self, placement):
        '''
        Methode : modificateur de l'attribut proprietaire qui modifie celui ci.
        '''
        self.placement = placement
        
       
    def __str__( self ):
        '''
        Methode : methode redefinie afin de mettre en forme les chaines de caracteres.
        '''
        if (self.estGaree == True) :
            return "Voiture '"+ str(self.immatriculation) + "' garee -> place '" + str(self.placement.getPlace().getNumPlace()) + "'"
        else :
            return "Voiture '"+ str(self.immatriculation) + "' non garee"
        
    
    
    def setPlaceAttribuee(self, bool):
        '''
        Methode : modificateur de l'attribut proprietaire qui modifie celui ci.
        '''
        self.placeAttribuee = bool
        
    
    def getPlaceAttribuee(self):
        '''
        Methode : accesseur de l'attribut estLibre qui retourne celui-ci.
        '''
        return self.placeAttribuee
    